package cn.haut.online_read.crawler.sanwenzx;

import lombok.extern.slf4j.Slf4j;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.xsoup.Xsoup;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xing
 * @date 2021-05-22 14:41
 */
@Slf4j
public class ArticleCrawler3 implements PageProcessor {

    private Site site = Site.me().setSleepTime(1);
    public static final String NBSP = " ";

    @Override
    public void process(Page page) {
        // 爬取内容


        // 网站目前发现有两种格式，一种是 p 下 很多 span 里放的分开的段落内容，一种是 p 下 span 下由包着一个 span 里边是一整个段落
        // 测试获取 span 下 span 的 text ，
        boolean testPText = Xsoup.compile("//div[@class='content']/table/tbody/tr/td/p[2]/allText()").evaluate(page.getHtml().getDocument()).get() != null  || Xsoup.compile("//div[@class='content']/table/tbody/tr/td/p[3]/allText()").evaluate(page.getHtml().getDocument()).get() != null;
        String testTbodyText = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/table/text()").get();

        List<String> pList = new ArrayList<>();

        if (testTbodyText != null) {
            // 获取
            int size = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/table/tbody/tr/td/p").all().size();
            for (int i = 0; i < size; i++) {
                String pText = Xsoup.compile("//div[@class='content']/table/tbody/tr/td/table/tbody/tr/td/p["+ i +"]/allText()").evaluate(page.getHtml().getDocument()).get();
                if(pText != null) {
                    //  先分离, 这里 p 标签下有跟多段落，根据段落前 &nbsp; 分开
                    String[] split = pText.split(NBSP);
                    for (String s : split) {
                        // 清除 空格
                        s = s.replace(NBSP, "").trim();
                        // 不为空
                        if(!s.isEmpty()) {
                            // 添加进结果列表
                            pList.add(s);
                        }
                    }
                }
            }
        } else {
            int pNum = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/p").all().size();
            // 内容在 p 的 很多 span 下，每个 span 里为一段的一部分
            for (int i = 1; i < pNum + 1; i++) {
                // 获取文本
                String pText = Xsoup
                        .compile("div[@class='content']/table/tbody/tr/td/p[" + i + "]/allText()")
                        .evaluate(page.getHtml().getDocument())
                        .get();
                // 不为 null
                if(pText != null) {
                    // 清除空格
                    pText = pText
                            .replace(NBSP, "")
                            .replace("　", "")
                            .trim();
                    // 不为空
                    if(!pText.isEmpty()){
                        // 添加到结果列表
                        pList.add(pText);
                    }
                }
            }
        }

        page.putField("paragraphs", pList);
    }

    @Override
    public Site getSite() {
        return site;
    }
}
